//求最短路径为多长

#include<bits/stdc++.h>
using namespace std;

int m,n,p,q,minans=9999;//m行n列的迷宫，(p,q)表示终点
int a[100][100];//1表示空地，2表示障碍
int v[100][100];//0表示未访问，1表示访问
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y,int step){
    if(x==p && y==q){
        if(step<minans){
            minans=step;   
            return;
        }
    }

    for(int k=0;k<4;k++){
        int tx,ty;
        tx=x+dx[k];
        ty=y+dy[k];
        //其实这里还应该加一个条件，就是要判断tx和ty是否在数组中，有没有越界
        //就像这样：if(tx<1||tx>n||ty<1||ty>n||yz[j]!=a[tx][ty])
        if(a[tx][ty]==1 && v[tx][ty]==0){
            v[tx][ty]=1;
            dfs(tx,ty,step+1);
            v[tx][ty]=0;   
        } 
    }
    return;
}
/*
移动方向的数组定义：顺时针：右，下，左，上
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
        (x-1,y)
(x,y-1)  (x,y)  (x,y+1)
        (x+1,y)
*/


/*
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3

输出：7
注：迷宫大小为5行4列，起点为(1,1)，终点为(2,1)
    输入的第一行为迷宫大小，第二行为起点和终点
    1代表可走，2表示为障碍
    输出最短路径为多长
*/
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    int startx,starty;//起点
    cin>>startx>>starty>>p>>q;
    v[startx][starty]=1;
    dfs(startx,starty,0);
    cout<<minans;
    return 0;
}